package core;

import java.util.ArrayList;
import java.util.List;

/**
 * Enum censé remplacer l'objet {@link Option} actuel. <br/>
 * Recense la liste des options actuellement disponibles pour un projet 3D.
 * 
 * @author sebastien
 */
public enum NewOption {

	AXES("Axes", Boolean.TYPE, Boolean.FALSE), //
	ANIMATION("Animation", Boolean.TYPE, Boolean.FALSE), //
	LIGHTS("Lumières", Boolean.TYPE, Boolean.FALSE), //
	TEST("Test", Integer.TYPE, 20), //
	GRID("Grille", Boolean.TYPE, Boolean.FALSE), //
	TEST2("Test2", Integer.TYPE, 20);

	// Fields
	/** Label affiché à l'écran */
	String label;
	/** Le type de l'option : Boolean, Integer ? */
	Class<?> type;
	/** La valeur de l'option (dépendante du type) */
	Object value;

	// Constructor
	NewOption(String label, Class<?> type, Object value) {
		this.label = label;
		this.type = type;
		this.value = value;
	}

	// Methods
	/**
	 * Renvoie la liste de type d'options
	 * 
	 * @return
	 */
	public List<Class<?>> getTypesList() {
		List<Class<?>> list = new ArrayList<Class<?>>();
		for (NewOption option : NewOption.values()) {
			if (!list.contains(option.getType())) {
				list.add(option.getType());
			}
		}
		return list;
	}

	/**
	 * Renvoie l'option définie par son nom, null si celle-ci n'existe pas.
	 * 
	 * @param label
	 * @return
	 */
	public static NewOption getOption(String label) {
		for (NewOption option : values()) {
			if (option.getLabel().equals(label)) {
				return option;
			}
		}
		return null;
	}

	/**
	 * Inverse la valeur de l'option. <br>
	 * Ex : si la valeur est vrai, elle devient fausse. <br>
	 * Cette méthode n'agit que sur les options de type booléen.
	 */
	public void switchValue() {
		if (type.equals(Boolean.TYPE)) {
			Boolean value = (Boolean) getValue();
			setValue(!value);
		}
	}

	// Accessors
	public String getLabel() {
		return label;
	}

	public Class<?> getType() {
		return type;
	}

	public Object getValue() {
		return value;
	}

	public void setLabel(String label) {
		this.label = label;
	}

	public void setType(Class<?> type) {
		this.type = type;
	}

	public void setValue(Object value) {
		this.value = value;
	}

}
